package com.game.commons.scripts.java.classlistener;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.apache.log4j.Logger;

import com.game.commons.scripts.java.metadata.OnClassLoad;
import com.game.commons.scripts.java.metadata.OnClassUnload;


/**
 * 默认的class监听
 * @author 杜祥
 * @date 2013-5-17
 */
public class DefaultClassListener implements ClassListener 
{
	
	private static final Logger log = Logger.getLogger(DefaultClassListener.class);
	
	
	
	@Override
	public void postLoad(Class<?>[] classes)
	{
		for(Class<?> c : classes)
		{
			doMethodInvoke(c.getDeclaredMethods(), OnClassLoad.class);
		}
	}

	@Override
	public void preUnload(Class<?>[] classes)
	{
		for(Class<?> c : classes)
		{
			doMethodInvoke(c.getDeclaredMethods(), OnClassUnload.class);
		}
	}
	
	
	
	/**
	 * 调用注解过 annotationClass的方法（针对静态方法有效）
	 * @param methods
	 * 						方法
	 * @param annotationClass
	 * 						注解类型
	 */
	protected final void doMethodInvoke(Method[] methods, Class<? extends Annotation> annotationClass)
	{
		for(Method m : methods)
		{
			/*判断是否为静态方法*/
			if(!Modifier.isStatic(m.getModifiers()))
				continue;
			/*获得方法的accessible标志的值*/
			boolean accessible = m.isAccessible();
			
			m.setAccessible(Boolean.TRUE);
			
			if(m.getAnnotation(annotationClass) != null)
			{
				try
				{
					m.invoke(null);
				}
				catch (IllegalAccessException e) 
				{
					log.error("无法访问类[" + m.getDeclaringClass().getName() + "]的[" + m.getName() + "]方法。", e);
				}
				catch (InvocationTargetException e) 
				{
					log.error("无法访问类[" + m.getDeclaringClass().getName() + "]的[" + m.getName() + "]方法。", e);
				}
			}
			
			m.setAccessible(accessible);
		}
	}
	

}
